#include<stdio.h>
#include<stdlib.h>
//  struct ListNode {
//      int val;
//      struct ListNode *next;
//  };
// 
//struct ListNode* removeElements(struct ListNode* head, int val) {
//    struct ListNode* cur = head;
//    struct ListNode* tail = NULL;
//    struct ListNode* phead = NULL;
//    while (cur) {
//        if (cur->val != val) {
//            if (tail == NULL) {
//                tail = phead = cur;
//            }
//            else {
//                tail->next = cur;
//                tail = tail->next;
//            }
//            cur = cur->next;
//        }
//        else {
//            struct ListNode* next = cur->next;
//            free(cur);
//            cur = next;
//        }
//    }
//    if (tail)    tail->next = NULL;
//    return phead;
//}
// 
//struct ListNode {
//    int val;
//    struct ListNode* next;
//};
//
//struct ListNode* deleteMiddle(struct ListNode* head) {
//    if (head->next == NULL || head == NULL) {
//        return NULL;
//    }
//    size_t sum = 0;
//    struct ListNode* fail = head;
//    while (fail) {
//        fail = fail->next;
//        sum++;
//    }
//    size_t n = sum / 2;
//    struct ListNode* perv = fail = head;
//    while (n--) {
//        fail = fail->next;
//    }while (--n) {
//        perv = perv->next;
//    }
//   
//    perv->next = fail->next;
//   // struct ListNode* next = fail->next;
//    //free(fail);
//   // fail = next;
//    return head;
//}
//int main() {
//    struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
//    if (n1 == NULL) return 1;
//    struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
//    if (n2 == NULL) return 2;
//    struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
//    if (n3 == NULL) return 3;
//    struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
//    if (n4 == NULL) return 4;
//    struct ListNode* n5 = (struct ListNode*)malloc(sizeof(struct ListNode));
//    if (n5 == NULL) return 5;
//    struct ListNode* n6 = (struct ListNode*)malloc(sizeof(struct ListNode));
//    if (n6 == NULL) return 6;
//    struct ListNode* n7 = (struct ListNode*)malloc(sizeof(struct ListNode));
//    if (n7 == NULL) return 7;
//
//    n1->val = 1;
//    n2->val = 3;
//    n3->val = 4;
//    n4->val = 7;
//    n5->val = 1;
//    n6->val = 2;
//    n7->val = 6;
//   
//
//    n1->next = n2;
//    n2->next = n3;
//    n3->next = n4;
//    n4->next = n5;
//    n5->next = n6;
//    n6->next = n7;
//    n7->next = NULL;
//
//    struct ListNode* head = deleteMiddle(n1);
//}
